package com.example.sunming.fanshe;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * @author: sunming
 * @date: 2020/4/10
 * @description:
 */
public class TestClassMethod {

    public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        Class clazz2 = Person.class;
        //通过反射调用有参构造函数初始化对象（上面演示过）
        Constructor constructor = clazz2.getConstructor(String.class, Integer.class);
        Object obj = constructor.newInstance("sunming", 18);

        //获取类所有公共类型方法   这里包括 Object 类的一些方法
        Method[] methods = clazz2.getMethods();
        StringBuilder methodsName = new StringBuilder();
        for (Method method : methods) {
            methodsName.append(method.getName()).append("  ");
        }
        System.err.println("7类公共类型方法： " + methodsName);

        //获取该类中的所有方法（包括私有）
        Method[] methodsAll = clazz2.getDeclaredMethods();
        methodsName = new StringBuilder();
        for (Method method : methodsAll) {
            methodsName.append(method.getName()).append("  ");
        }
        System.err.println("8类中的所有方法： " + methodsName);

        //获取并使用指定方法
        Method method1 = clazz2.getDeclaredMethod("method1");//获取无参私有方法
        method1.setAccessible(true);//设置为true才能获取私有方法
        method1.invoke(obj);//调用无参方法

        Method method2 = clazz2.getMethod("method2", String.class);//获取有参数方法
        method2.invoke(obj, "666");//调用有参方法

    }
}
